package com.clp.util.hutool.core.lang;

import com.clp.util.hutool.core.util.ArrayUtil;
import com.clp.util.hutool.core.util.StrUtil;

import static java.lang.System.err;
import static java.lang.System.out;

/**
 * 命令行（控制台）工具方法类
 */
public class Console {
    private static final String TEMPLATE_VAR = "{}";

    public static void print(Object obj) {
        print(TEMPLATE_VAR, obj);
    }

    /**
     * 同 System.out.print() 方法，打印控制台日志
     * @param template 文本模板，被替换的部分用 {} 表示
     * @param values 值
     */
    public static void print(String template, Object... values) {
        if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) {
            printInternal(template, values);
        } else {
            printInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template));
        }
    }

    /**
     * 同 System.out.println() 方法，打印控制台日志
     * @param template
     * @param values
     */
    private static void printInternal(String template, Object... values) {
        out.print(StrUtil.format(template, values));
    }

    /**
     * 构建空格分隔的模板，类似于 "{} {} {} {}"
     * @param count
     * @return
     */
    private static String buildTemplateSplitBySpace(int count) {
        return StrUtil.repeatAndJoin(TEMPLATE_VAR, count, StrUtil.SPACE);
    }

    public static void error(String template, Object... values) {
        if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) {
            errorInternal(template, values);
        } else {
            errorInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template));
        }
    }

    private static void errorInternal(String template, Object... values) {
        error(null, template, values);
    }

    public static void error(Throwable t, String template, Object... values) {
        err.println(StrUtil.format(template, values));
        if (null != t) {
            t.printStackTrace(err);
            err.flush();
        }
    }
}
